/**
 * aes.js
 * CryptoJS ^4.2.0
 * 该文件提供了基于 CryptoJS 库的 AES 加密和解密功能。
 * 提供了两个主要函数：encrypt 和 decrypt。
 * 使用示例：
 *
 * import { encrypt, decrypt } from './aes.js';
 *
 * // 使用明文密钥进行加密和解密
 * const encryptedText = encrypt('admin', '7wMVX27NXkSSnX7G');
 * console.log(encryptedText); // 输出加密后的字符串 fbwOtDcGgLjcj8B8hEn6fw==
 *
 * const decryptedText = decrypt('fbwOtDcGgLjcj8B8hEn6fw==', '7wMVX27NXkSSnX7G');
 * console.log(decryptedText); // 输出解密后的字符串 admin
 *
 * // 使用16进制密钥进行加密和解密
 * const encryptedTextHex = encrypt('admin', '37774d565832374e586b53536e583747', true);
 * console.log(encryptedTextHex); // 输出加密后的字符串 fbwOtDcGgLjcj8B8hEn6fw==
 *
 * const decryptedTextHex = decrypt('fbwOtDcGgLjcj8B8hEn6fw==', '37774d565832374e586b53536e583747', true);
 * console.log(decryptedTextHex); // 输出解密后的字符串 admin
 */

import CryptoJS from 'crypto-js'

// 加密
// encrypt('admin','7wMVX27NXkSSnX7G')
/**
 * 加密函数
 * @param {string} word - 需要加密的明文字符串
 * @param {string} key - 加密密钥
 * @param {boolean} [isHex=false] - 指定 key 是否为16进制字符串，默认为 false (明文)
 * @returns {string} 加密后的字符串
 * @example
 * import { encrypt, decrypt } from './aes.js';
 * const encryptedText = encrypt('admin', '7wMVX27NXkSSnX7G');
 * console.log(encryptedText); // 输出加密后的字符串 fbwOtDcGgLjcj8B8hEn6fw==
 */
export function encrypt(word, key, isHex = false) {
  // 根据 isHex 参数判断 key 是否为16进制字符串
  if (!isHex) {
    key = CryptoJS.enc.Utf8.parse(key).toString(CryptoJS.enc.Hex)
  }
  key = CryptoJS.enc.Hex.parse(key)
  var srcs = CryptoJS.enc.Utf8.parse(word)
  var encrypted = CryptoJS.AES.encrypt(srcs, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.ZeroPadding,
  })
  return encrypted.toString()
}

/**
 * 解密函数
 * @param {string} word - 需要解密的密文字符串
 * @param {string} key - 解密密钥
 * @param {boolean} [isHex=false] - 指定 key 是否为16进制字符串，默认为 false (明文)
 * @returns {string} 解密后的字符串
 * @example
 * const decryptedText = decrypt('fbwOtDcGgLjcj8B8hEn6fw==', '7wMVX27NXkSSnX7G');
 * console.log(decryptedText); // 输出解密后的字符串 admin
 */
export function decrypt(word, key, isHex = false) {
  // 根据 isHex 参数判断 key 是否为16进制字符串
  if (!isHex) {
    key = CryptoJS.enc.Utf8.parse(key).toString(CryptoJS.enc.Hex)
  }
  key = CryptoJS.enc.Hex.parse(key)

  var decrypt = CryptoJS.AES.decrypt(word, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.ZeroPadding,
  })
  return CryptoJS.enc.Utf8.stringify(decrypt).toString()
}
